import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';

import '../../app/controllers/app_controller.dart';
import '../../app/controllers/auth_controller.dart';
import '../../app/controllers/theme_controller.dart';
import '../../app/controllers/language_controller.dart';
import '../../app/controllers/connectivity_controller.dart';
import '../../app/services/api/api_service.dart';
import '../../app/services/storage/local_storage_service.dart';
import '../../app/services/storage/secure_storage_service.dart';
import '../../app/services/auth_service.dart';
import '../../app/services/theme_service.dart';
import '../../app/services/analytics_service.dart';
import '../../app/services/device/connectivity_service.dart';
import '../../app/services/device/permission_service.dart';
import '../../app/data/repositories/auth_repository.dart';
import '../../app/data/repositories/user_repository.dart';
import '../../app/data/providers/auth_provider.dart';
import '../../app/data/providers/user_provider.dart';
import '../../app/domain/services/auth_business.dart';
import '../../app/domain/services/user_business.dart';
import '../network/api_provider.dart';
import '../network/http_client.dart';
import '../errors/error_handler.dart';

/// 依赖注入器
/// 负责注册和管理应用的依赖关系
class DependencyInjector {
  /// 初始化所有依赖
  static Future<void> init() async {
    await _registerCoreServices();
    await _registerNetworkServices();
    await _registerStorageServices();
    await _registerProviders();
    await _registerRepositories();
    await _registerBusinessServices();
    await _registerAppServices();
    await _registerControllers();
  }
  
  /// 注册核心服务
  static Future<void> _registerCoreServices() async {
    // 注册GetStorage
    await GetStorage.init();
    Get.put(GetStorage(), permanent: true);
    
    // HTTP客户端
    Get.put<HttpClient>(HttpClient(), permanent: true);
    
    // 错误处理器
    Get.put<ErrorHandler>(ErrorHandler(), permanent: true);
  }
  
  /// 注册网络服务
  static Future<void> _registerNetworkServices() async {
    // API提供者
    Get.put<ApiProvider>(ApiProvider(), permanent: true);
    
    // API服务
    Get.put<ApiService>(ApiService(), permanent: true);
  }
  
  /// 注册存储服务
  static Future<void> _registerStorageServices() async {
    // 本地存储服务
    Get.put<LocalStorageService>(LocalStorageService(), permanent: true);
    
    // 安全存储服务
    Get.put<SecureStorageService>(SecureStorageService(), permanent: true);
  }
  
  /// 注册数据提供者
  static Future<void> _registerProviders() async {
    // 认证提供者
    Get.put<AuthProvider>(AuthProvider(), permanent: true);
    
    // 用户提供者
    Get.put<UserProvider>(UserProvider(), permanent: true);
  }
  
  /// 注册数据仓库
  static Future<void> _registerRepositories() async {
    // 认证仓库
    Get.put<AuthRepository>(AuthRepository(), permanent: true);
    
    // 用户仓库
    Get.put<UserRepository>(UserRepository(), permanent: true);
  }
  
  /// 注册业务服务
  static Future<void> _registerBusinessServices() async {
    // 认证业务
    Get.put<AuthBusiness>(AuthBusiness(), permanent: true);
    
    // 用户业务
    Get.put<UserBusiness>(UserBusiness(), permanent: true);
  }
  
  /// 注册应用服务
  static Future<void> _registerAppServices() async {
    // 认证服务
    Get.put<AuthService>(AuthService(), permanent: true);
    
    // 主题服务
    Get.put<ThemeService>(ThemeService(), permanent: true);
    
    // 分析服务
    Get.put<AnalyticsService>(AnalyticsService(), permanent: true);
    
    // 设备连接服务
    Get.put<ConnectivityService>(ConnectivityService(), permanent: true);
    
    // 权限服务
    Get.put<PermissionService>(PermissionService(), permanent: true);
  }
  
  /// 注册控制器
  static Future<void> _registerControllers() async {
    // 应用控制器
    Get.put<AppController>(AppController(), permanent: true);
    
    // 认证控制器
    Get.put<AuthController>(AuthController(), permanent: true);
    
    // 主题控制器
    Get.put<ThemeController>(ThemeController(), permanent: true);
    
    // 语言控制器
    Get.put<LanguageController>(LanguageController(), permanent: true);
    
    // 连接控制器
    Get.put<ConnectivityController>(ConnectivityController(), permanent: true);
  }
  
  /// 延迟初始化依赖
  static void lazyInit() {
    // 需要延迟初始化的依赖项
    // Get.lazyPut<SomeService>(() => SomeService());
  }
  
  /// 注册标签依赖
  static void registerWithTag<T>(T dependency, String tag) {
    Get.put<T>(dependency, tag: tag, permanent: true);
  }
  
  /// 按需初始化依赖
  static T initDependency<T>(T Function() init) {
    if (!Get.isRegistered<T>()) {
      Get.put<T>(init(), permanent: true);
    }
    return Get.find<T>();
  }
  
  /// 重置所有依赖（通常在用户登出时使用）
  static void reset() {
    Get.reset();
    init();
  }
} 